package com.fll.fangyiuser.service.impl;

import com.fll.fangyicommon.entity.user.Message;
import com.fll.fangyiuser.dao.MessageDao;
import com.fll.fangyiuser.service.MessageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashSet;

/**
 * @author fll
 * create 2023/3/3
 */
@Service
@Slf4j
public class MessageServiceImpl implements MessageService {

    @Autowired
    private MessageDao messageDao;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer insert(Message message) {
        Integer num = messageDao.insert(message);
        if (num != 0){
            log.info("message插入成功===>{}", message);
            //插入过后再次改变为最后一条
            message.setIsLast(1);
            messageDao.update(message);
            return num;
        }
        log.warn("message插入失败===>{}", message);
        return null;
    }

    @Override
    public ArrayList<Message> getHisMsg(Integer userId, Integer friendId) {
        ArrayList<Message> messages = messageDao.getHisMsg(userId, friendId);
        if (messages != null){
            log.info("获取历史消息成功===>{}", messages);
            return messages;
        }
        log.warn("历史消息为空");
        return null;
    }

    /**
     * 用户的聊天列表（在message表里查询和本人聊天的用户，作展示）
     * HashSet去重比数据库distinct去重效率高
     * @param userId
     * @return
     */
    @Override
    public HashSet<Integer> getChat(Integer userId){
        HashSet<Message> chatSet = messageDao.getChat(userId);
        if (chatSet.isEmpty()){ //为空
            log.info("用户：===>{}暂无消息列表", userId);
            return null;
        } else {
            HashSet<Integer> userIdSet = new HashSet<>();
            //chatSet记录本用户作为发送用户和接收用户情况下，记录本用户和其它用户的userId
            //因此遍历这些所有的userId，存入set去重，再把本用户的userId剔除掉，即为好友的userId
            for (Message message : chatSet){
                userIdSet.add(message.getSenderId());
                userIdSet.add(message.getAcceptorId());
            }
            if (userIdSet.contains(userId)){
                //剔除掉本用户id
                userIdSet.remove(userId);
            }
            log.info("获取用户：===>{}消息列表成功(只展示用户id)==={}",userId, chatSet);
            return userIdSet;
        }
    }

    /**
     * 查询两个用户之间最新的一条消息
     * @param userId
     * @param friendId
     * @return
     */
    @Override
    public Message getTheNewOne(Integer userId, Integer friendId){
        //此处不可能为空，因为传过来的friendId已经做过判断，有消息记录
        return messageDao.getTheNewOne(userId, friendId);
    }

}
